Feature/sqlite compiletime#1180
Conversation
|
Hi, as mentioned, will you do the standard library pendant? (provide api functions) else this isn't publicly usable unless users define @extern natives by themselves? |
c31188a to
4eabb8b
Compare
|
Updated this PR with the clean implementation (including handle validation, statement connection ownership tracking, auto-finalizing open statements when closing connections, and explicit interpreter error messages). Also opened the WurstStdlib2 PR providing the native |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1742a4fbd7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
d03161c to
5d16740
Compare
5d16740 to
6e51eb3
Compare
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6e51eb3786
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
sqlite_reset previously called PreparedStatement.clearParameters(), wiping all bound parameters. This diverges from SQLite's sqlite3_reset(), which resets execution state but leaves bindings in place, and broke the common reuse pattern of binding a parameter once, stepping, resetting, and stepping again without rebinding. sqlite_reset now only clears the execution state (open result set and the executed marker). A separate sqlite_clear_bindings native maps to sqlite3_clear_bindings() for callers that explicitly want to drop bindings. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Address adversarial review findings on the SQLite compiletime natives: - sqlite_exec now runs every statement of a ';'-separated script instead of silently dropping all but the first (JDBC/xerial only executes the first). Splitting respects string literals, quoted identifiers and comments. - sqlite_open rejects smuggled URI query parameters and explicitly disables extension loading, closing a load_extension() -> dlopen native-code vector reachable from a malicious compiletime dependency. - sqlite_close now always closes the connection even if finalizing a statement throws, aggregating errors, so the connection can no longer leak. - (re)binding a parameter invalidates prior execution state, so binding new values after a step (without an explicit sqlite_reset) re-executes instead of being silently ignored. - Added sqlite_column_is_null so callers can distinguish SQL NULL from an empty string / zero value. - closeAllSqliteResources no longer resets the handle counter, keeping handles monotonic so a stale handle can never alias a new resource. - Documented the 1-based bind / 0-based column index convention and the 32-bit truncation of sqlite_column_int. - Removed dead, cleanup-escaping fallback branches in RunTests. Tests: multi-statement exec, rebind-without-reset re-execution and NULL detection compiletime tests, plus unit tests for the SQL statement splitter. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Follow-up: binding preservation + hardening passPushed two commits addressing the
|
Follow-up to the second adversarial review. Replace the hand-rolled SQL statement splitter in sqlite_exec with a direct call to SQLite's native sqlite3_exec (via the xerial driver's low-level DB handle). The splitter could not parse trigger BEGIN...END bodies, CASE...END, or the [id] / `id` identifier-quoting forms, so those scripts were shredded into invalid fragments; delegating to SQLite's own parser handles all of them. The splitter and its unit tests are removed; a native test now exercises a multi-statement script containing a trigger and a ';'-bearing quoted identifier. Also from the review: - sqlite_open now only rejects query parameters on the "file:" URI form, so a plain path legitimately containing '?' (e.g. on Linux) is accepted; enableLoadExtension(false) remains the defense-in-depth backstop for all paths (the extension-loading vector was verified closed either way). - Documented that (re)binding a parameter closes any open result set. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
@codex review |
|
Codex Review: Something went wrong. Try again later by commenting “@codex review”. ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: deffe83656
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Add native-level tests proving each sqlite_* native's intended behavior and its error contract, filling the gaps left by the happy-path-only tests: - Round-trip of every column type (int/real/string) plus NULL -> "" and sqlite_column_is_null (both directions); sqlite_column_count before and after the first step. - sqlite_step returns false past the last row. - sqlite_reset rewinds a SELECT result set (re-reads from the first row). - sqlite_column_int truncation of a 64-bit INTEGER (documented behavior). - Native-level bind round-trip, rebind-after-step re-execution and binding persistence, and sqlite_clear_bindings resetting params to NULL. - sqlite_finalize invalidates the statement handle; sqlite_close invalidates the connection and cascades to its statements. - Invalid-handle and bad-SQL error paths across bind/step/reset/ clear_bindings/finalize/column_*/prepare/exec/close. - Security: sqlite_open rejects file: URIs with query parameters, and load_extension is not authorized on an opened connection. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
@codex review |
|
Codex Review: Something went wrong. Try again later by commenting “@codex review”. ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cedda7b226
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
sqlite_clear_bindings called stmt.clearParameters() but, unlike the sqlite_bind_* methods, did not markStatementForReexecution. So clearing bindings after a statement had already been stepped left the executed marker set (and any open result set cached): the next sqlite_step returned false without re-running the statement, silently skipping execution with the now-NULL parameters unless the caller also issued sqlite_reset. Clearing bindings is a parameter mutation and now has the same re-execution semantics as (re)binding. Adds two regression tests covering both sub-cases the asymmetry produced — the stale executed-marker (INSERT) path and the stale result-set (SELECT) path — each verified to fail without this change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fixed: re-execute after
|
|
@codex review |
|
Codex Review: Didn't find any major issues. Chef's kiss. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
This PR adds compiletime support for sqlite operations. Not thoroughly tested, but simple stuff works:
Self-contained Examples:
SQLite.txt
SQLiteHelder.txt